<?php
ini_set('error_reporting', 'E_ALL & ~E_DEPRECATED');
require_once 'simpletest/unit_tester.php';
require_once 'simpletest/reporter.php';
require_once dirname(__FILE__) . '/../DateMath.php';

class DateMathTest extends UnitTestCase
{
	/**
	 * コンストラクタに、201112231234を設定した場合
	 * bConditionにTrueが設定される
	 */
	public function test1100()
	{
		/** @var DateMath $objDateMath */
		$objDateMath = new DateMath('201112231234');
		$bRet = $objDateMath->bCondition;
		$this->assertTrue($bRet);
	}

	/**
	 * コンストラクタにユニックスタイムスタンプを設定した場合
	 * bConditionにＴＲＵＥが設定される。
	 */
	public function test1200()
	{
		$objDateMath = new DateMath(time(), TRUE);
		$bRet = $objDateMath->bCondition;
		$this->assertTrue($bRet);
	}

	/**
	 * コンストラクタに、201102301223を設定した場合
	 * bConditionにＦａｌｓｅが設定される
	 */
	public function test1300()
	{
		$objDateMath = new DateMath('201102301234');
		$bRet = $objDateMath->bCondition;
		$this->assertFalse($bRet);
	}

	/**
	 * コンストラクタに201112312359を設定した場合、
	 * 翌日の取得結果は、201201012359になる
	 */
	public function test1400()
	{
		$objDateMath = new DateMath('201112312359');
		$objDateMath->getDateAfterDays(1);
		$this->assertEqual($objDateMath->sYMDHM, '201201012359');
	}

	/**
	 * 今素ｔらくたに201112312359を設定した場合、１時間後の取得結果は
	 * 201201010059となる
	 */
	public function test1500()
	{
		$objDateMath = new DateMath('201112312359');
		$objDateMath->getDateAfterHours(1);
		$this->assertEqual($objDateMath->sYMDHM, '201201010059');
	}

	/**
	 * コンストラクタに201112312359を設定した場合
	 * １分後の取得結果は、2012010000になる
	 */
	public function test1600()
	{
		$objDateMath = new DateMath('201112312359');
		$objDateMath->getDateAfterMinutes(1);
		$this->assertEqual($objDateMath->sYMDHM, '201201010000');
	}

	/**
	 * コンストラクタに201112312359を設定した場合、
	 * パブリック（年）は、2011になる
	 */
	public function test2100()
	{
		$objDateMath = new DateMath('201112312359');
		$this->assertEqual($objDateMath->iResultYear, '2011');
		$this->assertEqual($objDateMath->iResultMonth, '12');
		$this->assertEqual($objDateMath->iResultDay, 31);
		$this->assertEqual($objDateMath->iResultHour, '23');
		$this->assertEqual($objDateMath->iResultMinute, '59');
	}

	/**
	 * コンストラクタに201112312359のＵＮＩＸタイムが設定されたとき
	 */
	public function test2200()
	{
		$uTime = mktime(23,59,0,12,31,2011);
		$objDateMath = new DateMath($uTime, TRUE);
		$this->assertEqual($objDateMath->iResultYear, '2011');
		$this->assertEqual($objDateMath->iResultMonth, '12');
		$this->assertEqual($objDateMath->iResultDay, 31);
		$this->assertEqual($objDateMath->iResultHour, '23');
		$this->assertEqual($objDateMath->iResultMinute, '59');
	}

	/**
	 * コンストラクタに201102282300を設定した場合
	 * 201103010100は１日経過となる
	 */
	public function test2300()
	{
		$objDateMath = new DateMath('201102282300');
		$RET = $objDateMath->getPastDay('201103010100');
		$this->assertEqual($RET, 1);
	}
	/**
	 * コンストラクタに201102282300を設定した場合
	 * 201103010110は２時間１０分経過となる
	 */
	public function test2500()
	{
		$objDateMath = new DateMath('201102282300');
		$RET = $objDateMath->getPastHourMinute('201103010110');
		$this->assertEqual($RET[DateMath::KEY_HOUR], 2);
		$this->assertEqual($RET[DateMath::KEY_MINUTE], 10);
	}

	/**
	* コンストラクタに201102282300を設定した場合
	* 201103010110のＵＮＩＸタイムスタンプは２時間１０分経過となる
	*/
	public function test2600()
	{
		$uTime = mktime(1,10,0,3,1,2011);
		$objDateMath = new DateMath('201102282300');
		$RET = $objDateMath->getPastHourMinute($uTime,TRUE);
		$this->assertEqual($RET[DateMath::KEY_HOUR], 2);
		$this->assertEqual($RET[DateMath::KEY_MINUTE], 10);
	}

	/**
	 * コンストラクタに201111010000を設定した場合、火曜日
	 */
	public function test3100()
	{
		$objDateMath = new DateMath('201111010000');
		$RET = $objDateMath->getDayOfWeek();
		$sDayOfWeekJp = $objDateMath->aryDayOfWeekJp[$RET];
		$this->assertEqual($sDayOfWeekJp, '火');
	}

	/**
	 * コンストラクタに201111010000を設定した場合
	 * 201111010000は水曜日
	 */
	public function test3200()
	{
		$objDateMath = new DateMath('201111010000');
		$RET = $objDateMath->getDayOfWeek('201111020000');
		$sDayOfWeekJp = $objDateMath->aryDayOfWeekJp[$RET];
		$this->assertEqual($sDayOfWeekJp, '水');
	}

	/**
	 * コンストラクタに20111010000 を設定した場合
	 * 二ヶ月後は201112
	 */
	public function test4100()
	{
		$objDateMath = new DateMath('201110010000');
		$RET = $objDateMath->getYYYYMM_afterMonth(2);
		$this->assertEqual($RET, '201112');
	}

	/**
	* コンストラクタに20111010000 を設定した場合
	* 3ヶ月後は201201
	*/
	public function test4200()
	{
		$objDateMath = new DateMath('201110010000');
		$RET = $objDateMath->getYYYYMM_afterMonth(3);
		$this->assertEqual($RET, '201201');
	}

	/**
	* コンストラクタに20120110000 を設定した場合
	* 1ヶ月前は201112
	*/
	public function test4300()
	{
		$objDateMath = new DateMath('201201100000');
		$RET = $objDateMath->getYYYYMM_afterMonth(-1);
		$this->assertEqual($RET, '201112');
	}

	/**
	* コンストラクタに20120110000 を設定した場合
	* 13ヶ月前は201012
	*/
	public function test4400()
	{
		$objDateMath = new DateMath('201201100000');
		$RET = $objDateMath->getYYYYMM_afterMonth(-13);
		$this->assertEqual($RET, '201012');
	}
}